#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

// 模拟电池参数
#define MAX_VOLTAGE 4.2   // 最大电池电压（单位：V）
#define MIN_VOLTAGE 3.0   // 最小电池电压（单位：V）
#define NUM_CELLS 12      // 电池单体数量

// 模拟电池数据
float cellVoltages[NUM_CELLS]; // 电池单体电压数组
float batteryCurrent;          // 电池电流
float batteryTemperature;      // 电池温度

// 状态标志
bool isPowerOn = false;        // 系统电源状态
bool isInsulationOk = true;    // 绝缘检测状态

// 电池健康和电量状态
float SOC = 100.0;             // 初始SOC为100%
float SOH = 100.0;             // 初始SOH为100%


void powerOn() {
    if (!isPowerOn) {
        isPowerOn = true;
        printf("System Power On\n");
        // 在这里加入硬件控制代码，接通高压电源
    } else {
        printf("System is already On\n");
    }
}

void powerOff() {
    if (isPowerOn) {
        isPowerOn = false;
        printf("System Power Off\n");
        // 在这里加入硬件控制代码，断开高压电源
    } else {
        printf("System is already Off\n");
    }
}


bool insulationCheck() {
    // 模拟绝缘检测，这里假设电池的绝缘电阻大于1MΩ为安全
    float insulationResistance = 1e6; // 1MΩ
    if (insulationResistance < 1e6) {
        printf("Insulation failure!\n");
        return false;
    } else {
        printf("Insulation OK\n");
        return true;
    }
}


void calculateSOC() {
    // 假设电池的SOC通过电压估算，实际应用中会更复杂，基于电流和时间积分等方法
    float totalVoltage = 0.0;
    for (int i = 0; i < NUM_CELLS; i++) {
        totalVoltage += cellVoltages[i];
    }
    float avgVoltage = totalVoltage / NUM_CELLS;

    if (avgVoltage >= MAX_VOLTAGE) {
        SOC = 100.0;
    } else if (avgVoltage <= MIN_VOLTAGE) {
        SOC = 0.0;
    } else {
        SOC = (avgVoltage - MIN_VOLTAGE) / (MAX_VOLTAGE - MIN_VOLTAGE) * 100.0;
    }

    printf("SOC: %.2f%%\n", SOC);
}


void calculateSOH() {
    // 假设电池的SOH通过电池电压与最大电压的比值估算，实际应根据容量衰减来估算
    float totalVoltage = 0.0;
    for (int i = 0; i < NUM_CELLS; i++) {
        totalVoltage += cellVoltages[i];
    }
    float avgVoltage = totalVoltage / NUM_CELLS;

    if (avgVoltage >= MAX_VOLTAGE) {
        SOH = 100.0;
    } else if (avgVoltage <= MIN_VOLTAGE) {
        SOH = 50.0;  // 假设当电压过低时SOH降低
    } else {
        SOH = (avgVoltage - MIN_VOLTAGE) / (MAX_VOLTAGE - MIN_VOLTAGE) * 100.0;
    }

    printf("SOH: %.2f%%\n", SOH);
}


int main() {
    // 模拟电池单体电压
    for (int i = 0; i < NUM_CELLS; i++) {
        cellVoltages[i] = 3.7;  // 默认电池电压为3.7V
    }

    // 模拟操作
    powerOn();  // 开启电池系统

    if (insulationCheck()) {  // 绝缘检测
        calculateSOC();        // 计算SOC
        calculateSOH();        // 计算SOH
    } else {
        printf("System cannot operate due to insulation failure.\n");
    }

    powerOff();  // 关闭电池系统

    return 0;
}
